/**
 * SSE相关类型定义
 */

/**
 * SSE请求参数
 */
export interface SSEChatRequest {
  request_id: string; // 请求ID
  content: string; // 消息内容
  file_infos?: FileInfo[]; // 文件信息
  session_id: string; // 会话ID
  bot_app_key: string; // 应用密钥
  visitor_biz_id: string; // 访客ID
  visitor_labels?: VisitorLabel[]; // 知识标签
  streaming_throttle?: number; // 流式回复频率控制
  custom_variables?: Record<string, string>; // 自定义参数
  system_role?: string; // 角色指令（提示词）
  incremental?: boolean; // 是否为增量输出
}

/**
 * 文件信息
 */
export interface FileInfo {
  file_name: string; // 文件名称
  file_size: string; // 文件大小
  file_url: string; // 文件URL
  file_type: string; // 文件类型
  doc_id: string; // 文档ID
}

/**
 * 知识标签
 */
export interface VisitorLabel {
  name: string; // 知识标签名
  values: string[]; // 知识标签值
}

/**
 * SSE回复事件
 */
export interface SSEReplyEvent {
  request_id: string; // 请求ID
  content: string; // 消息内容
  file_infos?: FileInfo[]; // 文件信息
  record_id: string; // 消息唯一ID
  related_record_id: string; // 关联的消息唯一ID
  session_id: string; // 会话ID
  is_from_self: boolean; // 消息是否由自己发出
  can_rating: boolean; // 该消息记录是否能评价
  timestamp: number; // 消息时间戳
  is_final: boolean; // 消息是否已输出完
  is_evil: boolean; // 是否命中敏感内容
  is_llm_generated: boolean; // 是否为模型生成内容
  reply_method: number; // 回复方式
  knowledge?: Knowledge[]; // 命中的知识
  option_cards?: string[]; // 选项卡
  custom_params?: string[]; // 用户自定义业务参数
  task_flow?: TaskFlow; // 任务流程调试信息
  work_flow?: WorkFlow; // 工作流调试信息
  quote_infos?: QuoteInfo[]; // 引用信息
}

/**
 * 命中的知识
 */
export interface Knowledge {
  id: string; // 命中的知识ID
  type: number; // 命中的知识类型：1-问答, 2-文档片段
}

/**
 * 任务流调试信息
 */
export interface TaskFlow {
  task_flow_name: string; // 任务流程名称
  task_flow_id: string; // 任务流程ID
  query_rewrite: string; // 问题改写结果
  hit_intent: string; // 命中的意图
  slot_info: Record<string, any>; // 运行时收集的槽位信息
  api_response: Record<string, any>; // API节点的返回信息
  type: number; // 任务流程回复类型
}

/**
 * 工作流调试信息
 */
export interface WorkFlow {
  workflow_name: string; // 工作流名称
  workflow_id: string; // 工作流ID
  qworkflow_run_id: string; // 工作流运行ID
  option_cards: string[]; // 选项卡
  current_node: CurrentNode; // 当前节点信息
  outputs: string; // 输出结果
}

/**
 * 当前工作流节点信息
 */
export interface CurrentNode {
  NodeID: string; // 节点ID
  NodeType: number; // 节点类型
  NodeName: string; // 节点名称
  Status: number; // 状态
  Input: string; // 节点的输入
  Output: string; // 节点的最终输出
  TaskOutput: string; // 任务的输出
  FailMessage: string; // 异常信息
  CostMilliSeconds: string; // 节点的总耗时
  Reply: string; // 当前节点的回复内容
  BelongNodeID: string; // 节点所属工作流
  StatisticInfo: StatisticInfo; // LLM统计信息
}

/**
 * LLM统计信息
 */
export interface StatisticInfo {
  ModelName: string; // 模型名称
  FirstTokenCost: number; // 首token耗时
  TotalCost: number; // 推理总耗时
  InputTokens: number; // 输入token数量
  OutputTokens: number; // 输出token数量
  TotalTokens: number; // 输入+输出总token
}

/**
 * 引用信息
 */
export interface QuoteInfo {
  index: number; // 引用的角标索引
  position: number; // 在回复内容content中的位置
}

/**
 * Token统计事件
 */
export interface TokenStatEvent {
  session_id: string; // 会话ID
  request_id: string; // 请求ID
  record_id: string; // 消息记录ID
  status_summary: string; // 本轮对话状态
  status_summary_title: string; // 本轮对话状态描述
  elapsed: number; // 本轮调用耗时
  token_count: number; // 本轮请求消耗token数
  procedures: Procedure[]; // 调用过程列表
}

/**
 * 调用过程
 */
export interface Procedure {
  name: string; // 英文名
  title: string; // 调用过程描述
  status: string; // 调用过程状态
  input_count: number; // 当次过程输入消耗token数
  output_count: number; // 当次过程输出消耗token数
  count: number; // 当次过程消耗总token数
}

/**
 * 参考来源事件
 */
export interface ReferenceEvent {
  record_id: string; // 消息唯一ID
  references: ReferenceSource[]; // 参考来源
}

/**
 * 参考来源
 */
export interface ReferenceSource {
  id: string | number; // 参考来源ID
  type: number; // 参考来源类型: 1-问答, 2-文档片段, 4-联网检索
  url?: string; // 参考来源链接
  name: string; // 参考来源名称
  doc_id?: string | number; // 参考来源文档ID
  doc_biz_id?: string | number; // 参考来源文档业务ID
  doc_name?: string; // 参考来源文档名称
  qa_biz_id?: string; // 参考来源问答业务ID
}

/**
 * 思考事件
 */
export interface ThoughtEvent {
  elapsed: number; // 本轮调用耗时
  is_workflow: boolean; // 是否工作流
  procedures: ThoughtProcedure[]; // 调用过程列表
  record_id: string; // 消息记录ID
  request_id: string; // 请求ID
  session_id: string; // 会话ID
  trace_id: string; // 链路ID
  workflow_name: string; // 工作流名称
}

/**
 * 思考过程
 */
export interface ThoughtProcedure {
  debugging: { content: string }; // 调试过程信息
  index: number; // 过程索引
  name: string; // 英文名
  title: string; // 调用过程描述
  status: 'processing' | 'success' | 'error' | string; // 状态: processing=进行中, success=成功, error=错误
  icon: string; // 图标
  switch: string; // 是否切换Agent
  workflow_name: string; // 工作流名称
  plugin_type: number; // 插件类型
  elapsed: number; // 当前请求执行时间
  reply_index?: number; // 回复索引
  node_name?: string; // 节点名称
}

/**
 * 错误事件
 */
export interface ErrorEvent {
  request_id: string; // 请求ID
  error: {
    code: number; // 错误码
    message: string; // 错误信息
  };
}

/**
 * SSE事件类型
 */
export enum SSEEventType {
  REPLY = 'reply',
  TOKEN_STAT = 'token_stat',
  REFERENCE = 'reference',
  THOUGHT = 'thought',
  ERROR = 'error'
}

/**
 * SSE事件数据
 */
export type SSEEventData = 
  | { type: SSEEventType.REPLY; payload: SSEReplyEvent }
  | { type: SSEEventType.TOKEN_STAT; payload: TokenStatEvent }
  | { type: SSEEventType.REFERENCE; payload: ReferenceEvent }
  | { type: SSEEventType.THOUGHT; payload: ThoughtEvent }
  | { type: SSEEventType.ERROR; error: ErrorEvent['error'] }; 